﻿using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.DependencyInjection;

namespace Wiz.Minio.EventData;

public class TestService : ITransientDependency
{
    private readonly ILogger<TestService> _logger;
    // Minio 文件服务实例，用于执行 Minio 文件的下载和压缩操作
    private readonly IMinioDownloadService _minioDownloadService;

    private void task_ProgressChanged(object sender, TaskProgressChangedEventArgs e)
    {
        _logger.LogInformation("任务 {taskId} 进度更新为: {Progress}%",e.TaskId,e.Progress);
    }

    private void task_StatusChanged(object sender, TaskStatusChangedEventArgs e)
    {
        string message = string.Empty;
            switch(e.Status){
                case DownloadTaskStatus.Success:
                    message = "任务成功";
                    break;
                case DownloadTaskStatus.Failed:
                    message = $"任务失败: {e.ErrorMessage}";
                    break;
                case DownloadTaskStatus.Running:
                    message = "任务开始启动";
                    break;
            }
            _logger.LogInformation("任务 {TaskId} 状态更新为: {Message}",e.TaskId, message);
    }

    private async Task startTaskAsync(MinioQueryDto dto, CancellationToken cancellationToken)
    {
        // 启动下载任务
        var response = await _minioDownloadService.StartDownloadTaskAsync(dto);
        // 如果任务启动失败，记录错误信息
        if(!response.IsSuccess){
            _logger.LogError("任务启动失败: {Message}",response.Message);
        }
        else
        {
            var zipStream = await _minioDownloadService.GetTaskStreamAsync(response.TaskId, cancellationToken);
            if(zipStream != null){
                // 处理文件流
                _logger.LogInformation("任务 {TaskId} 下载完成，文件大小为: {Length}",response.TaskId,zipStream.Length);
                // 释放文件流
                zipStream.Close();
            }
            // 下载完成后，移除任务
            _minioDownloadService.RemoveTask(response.TaskId);
        }
    }
   
    /// <summary>
    /// 异步启动测试服务任务。
    /// </summary>
    /// <returns>表示异步操作的任务</returns>
    public async Task StartAsync(CancellationToken cancellationToken){
        
        // 订阅进度变化事件
        _minioDownloadService.TaskProgressChanged += task_ProgressChanged;
        
        // 订阅状态变化事件
        _minioDownloadService.TaskStatusChanged += task_StatusChanged;

        // 查询Dto，包含了从 Minio 下载文件所需的信息
        var dto = new MinioQueryDto
        {
            // 对应 Minio 桶名
            DataSource = "461",  
            // 系统名称
            System = "ZL",
            // 设备名称
            Device = "aec",
            // 需要下载的文件代码列表
            Codes = new[]
            {
                "cld.and.xc_zl_aec_2017-07-21_081512",
                "cld.and.xc_zl_aec_2017-06-21_081512",
                "cld.and.xc_zl_aec_2017-06-21_091512"  
            }
        };
        await startTaskAsync(dto, cancellationToken);

        dto = new MinioQueryDto
        {
            // 对应 Minio 桶名
            DataSource = "461",  
            // 系统名称
            System = "ZL",
            // 设备名称
            Device = "aec",
            // 需要下载的文件代码列表
            Codes = new[]
            {
                "cld.and.xc_zl_aec_2017-07-21_081512",
                "cld.and.xc_zl_aec_2017-06-21_081512",
                "cld.and.xc_zl_aec_2017-06-21_061512"  
            }
        };
        await startTaskAsync(dto, cancellationToken);
    }

    public TestService(IMinioDownloadService minioDownloadService, ILogger<TestService> logger)
    {
        _minioDownloadService = minioDownloadService;
        _logger = logger;
    }
}
